
import bpy

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import 节点.对象操作.bl_物体拷贝 as 物体拷贝

from 节点.Core.物体 import bl_物体属性




def f_代码头置入_筛选面ID(self, context):
	代码头 = '# polygons:网格面, loops:网格循环, bound:边界框, data:[输出面ID]'
	self.m_Code.lines[0].body = 代码头

	成员说明 = "#.polygons[] .center-中心坐标 .vertices-顶点索引 .loop_start .loop_total"
	self.m_Code.lines[1].body = 成员说明

	成员说明 = "#.loops[] .vertex_index-顶点索引 .edge_index-边索引 .index"
	self.m_Code.lines[2].body = 成员说明

	成员说明 = "#.vertices[] .co[] .normal[] .index"
	self.m_Code.lines[3].body = 成员说明




class C_SceneNode_取物体网格面(基类.C_SN_基类):
	bl_dname = 'bl_node_取物体网格'
	bl_label = '取物体网格'


	m_Code = bpy.props.PointerProperty(type=bpy.types.Text, update=f_代码头置入_筛选面ID)

	def init(self, context):
		super(C_SceneNode_取物体网格面, self).f_init(context)

		self.inputs.new('C_NodeSocket_物体', name='物体')
		self.inputs.new('C_插座_List_i', name='元素索引')

		self.outputs.new('C_NodeSocket_网格', name='网格')
		
		
	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_Code', text='面ID生成脚本')
	
	def update(self):
		pass
		#self.f_pushUpdate()

	def f_update(self, 是否向下传递=False, input插座=None):
		物体 = self.inputs['物体'].f_getData()
		faces = self.inputs['元素索引'].f_getData()
		
		网格 = []
		for obj in 物体:
			if obj.type == 'MESH':
				if self.m_Code != None :
					边界框 = bl_物体属性.f_物体边界框转元组(obj)

					全局变量 = {'polygons':obj.data.polygons, 'loops':obj.data.loops, 'bound':边界框, 'data':[]}
					代码 = self.m_Code.as_string() + '\n'
					exec(代码, 全局变量)
					#print('全局变量[data] = ', self.name, 全局变量['data'])
					faces = 全局变量['data']
					
					for f in faces :
						new网格 = bpy.data.meshes.new('新mesh_'+obj.name)
						物体拷贝.f_拷贝网格数据(obj.data, new网格, f)
						网格.append(new网格)
				else:
					new网格 = bpy.data.meshes.new('新mesh_'+obj.name)
					物体拷贝.f_拷贝网格数据(obj.data, new网格, faces)
					网格.append(new网格)
		
		self.outputs['网格'].f_setData(网格)
				
		super(C_SceneNode_取物体网格面, self).f_update(是否向下传递, input插座)
		return False


class C_NODE_MENU_取物体网格面(bpy.types.Operator):
	bl_idname = 'node.global_node_get_mesh_faces'
	bl_label = '取物体网格面'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_SceneNode_取物体网格面', use_transform=True)
		return {'FINISHED'}










classes = (
	C_SceneNode_取物体网格面,
	C_NODE_MENU_取物体网格面,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)


